//
// Created by lyh on 18-11-4.
//

#include "work_deal.h"
#include <thread>
#include <mutex>
#include <iostream>
#include <unistd.h>
#include <mutex>

//这个函数是用来模拟柜台业务人员解决实际任务
void work_deal::solve_task(){
    while(true){
//        std::unique_lock<std::mutex> lck(mtx);//添加线程锁，保证柜台处理队列的时候，叫号机不会对队列进行处理
//        //被叫好机的cv.notify_one()唤醒，并获取了线程锁，但是如果此时队列为空的话，函数会在这里被阻塞，刚获得的锁也会得而复失
//        cv.wait(lck,[this] {
//            return !wait_queue.empty();//虽然在被唤醒，但是如果排队队列不为空就继续阻塞
//        });
        //检测如果排队队列不为空，就执行解决任务的操作
        while (!wait_queue.empty()){
            bool signal = true;//初始处理信号置1,不能设计成全局变量，必须是局部变量
            while (signal){
                //TO DO 解决任务
                sleep(2);//假装柜台人员解决一个任务花费5秒钟，这里睡眠5秒钟是模拟了解决任务
                std::cout<<"第"<<wait_queue.front()<<"号的业务办理结束，请第"<<wait_queue.front()+1<<"来柜台"<<std::endl;
                wait_queue.pop_front();//将刚刚已经解决的任务从队列中删除
                signal = false;//这个signal模拟了柜台人员处理完一个任务以后按一下按钮，本来应该从外界获取
            }
        }
    }
}
//这个函数是用来模拟获取排队序列号的
bool work_deal::get_wait_nmuber() {
    while(true){
        std::cin>>number;//模拟取号机上的取号按钮，输入0代表取号，输入其它数字无效
//        std::lock_guard <std::mutex> lgd(mtx);//添加了一把线程锁，保证在往排队队列中添加客户的时候，柜台人员不能同时对队列产生操作
        //判断取号机按钮是不是被按了0,按0代表取号，不是0则不执行操作
        if (number == 0){
            wait_queue.push_back(wait_numberth);//向排队队列中加入一个客户，队列中存放的是客户取得的排队序号，序号是从1开始标记并自动累加
            std::cout<<"您是第"<<wait_numberth++<<"号客户,"<<"当前有"<<wait_queue.size()<<"个用户在等待"<<std::endl;
//            cv.notify_one();//唤醒另外一个在等待锁的线程（即柜台处理线程）
        }
    }
}
//这个函数是用来处理工作的
work_deal::work_deal() {
    wait_call_ = std::thread(&work_deal::get_wait_nmuber,this);//创建了第一根线程，启动叫号机服务
    deal_thread_= std::thread(&work_deal::solve_task,this);//创建了第二根线程，启动柜台处理业务的服务
}